package com.cskaoyan.javase.array._1basic;

/**
 * 数组的基本使用
 * 目前我们使用数组,都是在main方法或者其他方法中使用,所以这里的数组变量都是局部变量,既然是局部变量,那么就应该先声明再初始化才能够使用,这是局部变量的特点,不是数组的特点.
 *
 * 局部变量一维数组的声明:
 *      声明的意义: 告诉编译器数组的数据类型和名字
 *      数组的名字如果是名词的话,尽量用复数形式
 *      格式一
 *      数据类型[] 数组名;
 *      格式二
 *      数据类型 数组名[];
 *      格式二是C语言风格的数组声明方式,既然我们是Java程序,应该使用格式一
 *      不要用格式二
 *
 * 局部变量一维数组的初始化:
 *      初始化的意义: 完成数组的创建并给数组赋值,需要:
 *          1.长度
 *          2.每个存储单元都必须有取值
 *      数组的初始化使用关键字"new"
 *
 * 格式一,静态初始化
 *      和数组的声明写在一起，语法格式就是：
 *      数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...};
 *
 *      静态初始化有简写的形式，可以省略new关键字，如下：
 *      数据类型[] 数组名 = {元素1,元素2,元素3...};
 *      但是注意简写不意味着没有用new关键字,它仍然用了
 *
 *       注：
 *       简化的形式必须跟在声明之后，不能单独使用！
 *
 * 格式二,动态初始化
 *      和数组的声明写在一起,语法格式是:
 *      数据类型[] 数组名 = new 数据类型[数组的长度];
 *      数组的动态初始化,指出了数组的长度,但是没有明确数组元素的取值
 *      注意:
 *          1.在动态初始化时,数组中的元素也是具有取值的,它的取值是一种默认值.
 *          2.数组的长度不是无限大小的,必须是一个int类型的正整数
 *              从理论上来说,Java 数组的长度最大值是int类型的最大值
 *
 * 数组的初始化需要完成数组内存空间的开辟,完成数组中元素的赋值
 * 那么问题来了:
 *      数组开辟的内存空间是什么内存空间呢?
 *      Java程序运行在JVM中,所以开辟的是JVM的内存空间
 *
 *
 * @since 11:40
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 声明一个int数组
        int[] arr;
        String[] names;

        // C-style array declaration of local variable 'arr2'.
        int arr2[];

        // 静态初始化一个长度为0的int数组,长度为0的数组不能存任何元素
        int[] arr3 = new int[]{};
        // 静态初始化一个长度为3的数组
        int[] arr4 = new int[]{1, 2, 3};
        // 静态初始化上述格式是可以简写的
        String[] arr5 = {"abc", "hello"};

        // 数组的长度不能改变,所以这种简写形式必须和声明写在一起.
        // arr5 = {};

        // 动态初始化一个长度为0的double数组
        double[] arr6 = new double[0];
        char[] arr7 = new char[3];

        // 数组长度为大于等于0的int类型整数
        // int[] arr8 = new int[-10];

        /*
            new关键字的语义就是：
            new关键字表示在堆上开辟空间，创建一个新的、独立的对象。
         */
        // 这种简写的形式仍然表示new创建了一个新的数组对象
        int[] arr9 = {123, 666};
        // 以下形式就不行,因为数组的长度就不可变
        // arr9 = {};

        // new表示创建新的,独立的对象,所以这里不省略new的情况下,是可以静态初始化赋值的
        arr9 = new int[]{111, 22, 333};
    }

    public static void test() {

    }
}
